home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Utilities / byacc 1.8.2 / symtab.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-04  |  2.0 KB  |  137 lines  |  [TEXT/R*ch]

  1. #include "defs.h"
  2.  
  3.  
  4. /* TABLE_SIZE is the number of entries in the symbol table. */
  5. /* TABLE_SIZE must be a power of two.                */
  6.  
  7. #define    TABLE_SIZE 1024
  8.  
  9.  
  10. bucket **symbol_table;
  11. bucket *first_symbol;
  12. bucket *last_symbol;
  13.  
  14.  
  15. #if __STDC__
  16. static int hash(char *name)
  17. #else
  18. static int hash(name)
  19. char *name;
  20. #endif
  21. {
  22.     register char *s;
  23.     register int c, k;
  24.  
  25.     assert(name != (char *) NULL && *name);
  26.     s = name;
  27.     k = *s;
  28.     while (c = *++s)
  29.     k = (31*k + c) & (TABLE_SIZE - 1);
  30.  
  31.     return (k);
  32. }
  33.  
  34.  
  35. #if __STDC__
  36. bucket *make_bucket(char *name)
  37. #else
  38. bucket *make_bucket(name)
  39. char *name;
  40. #endif
  41. {
  42.     register bucket *bp;
  43.  
  44.     assert(name != (char *) NULL);
  45.     bp = (bucket *) MALLOC(sizeof(bucket));
  46.     bp->link = 0;
  47.     bp->next = 0;
  48.     bp->name = MALLOC(strlen(name) + 1);
  49.     bp->tag = 0;
  50.     bp->value = UNDEFINED;
  51.     bp->index = 0;
  52.     bp->prec = 0;
  53.     bp-> class = UNKNOWN;
  54.     bp->assoc = TOKEN;
  55.  
  56.     strcpy(bp->name, name);
  57.  
  58.     return (bp);
  59. }
  60.  
  61.  
  62. #if __STDC__
  63. bucket *lookup(char *name)
  64. #else
  65. bucket *lookup(name)
  66. char *name;
  67. #endif
  68. {
  69.     register bucket *bp, **bpp;
  70.  
  71.     bpp = symbol_table + hash(name);
  72.     bp = *bpp;
  73.  
  74.     while (bp)
  75.     {
  76.     if (strcmp(name, bp->name) == 0) return (bp);
  77.     bpp = &bp->link;
  78.     bp = *bpp;
  79.     }
  80.  
  81.     *bpp = bp = make_bucket(name);
  82.     last_symbol->next = bp;
  83.     last_symbol = bp;
  84.  
  85.     return (bp);
  86. }
  87.  
  88.  
  89. #if __STDC__
  90. void create_symbol_table(void)
  91. #else
  92. void create_symbol_table()
  93. #endif
  94. {
  95.     register int i;
  96.     register bucket *bp;
  97.  
  98.     symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
  99.     for (i = 0; i < TABLE_SIZE; i++)
  100.     symbol_table[i] = 0;
  101.  
  102.     bp = make_bucket("error");
  103.     bp->index = 1;
  104.     bp->class = TERM;
  105.  
  106.     first_symbol = bp;
  107.     last_symbol = bp;
  108.     symbol_table[hash("error")] = bp;
  109. }
  110.  
  111.  
  112. #if __STDC__
  113. void free_symbol_table(void)
  114. #else
  115. void free_symbol_table()
  116. #endif
  117. {
  118.     FREE(symbol_table);
  119.     symbol_table = 0;
  120. }
  121.  
  122.  
  123. #if __STDC__
  124. void free_symbols(void)
  125. #else
  126. void free_symbols()
  127. #endif
  128. {
  129.     register bucket *p, *q;
  130.  
  131.     for (p = first_symbol; p; p = q)
  132.     {
  133.     q = p->next;
  134.     FREE(p);
  135.     }
  136. }
  137.